package com.ssy.lingxi.workflow.service;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.workflow.api.model.vo.request.*;
import com.ssy.lingxi.workflow.api.model.vo.response.ComplexTaskCompleteVO;
import com.ssy.lingxi.workflow.api.model.vo.response.SimpleTaskCompleteVO;

import java.util.List;

/**
 * 流程启动、执行相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-04-26
 */
public interface IProcessExecutionService {

    /**
     * 启动流程
     * @param startVO 接口参数
     * @return 启动结果
     */
    Wrapper<ComplexTaskCompleteVO> startProcess(TaskStartVO startVO);

    /**
     * 启动流程后，执行第一个Task
     * @param startVO 接口参数
     * @return 执行结果
     */
    Wrapper<ComplexTaskCompleteVO> startProcessThenCompleteFirstTask(TaskStartVO startVO);

    /**
     * 执行流程步骤
     * @param executeVO 接口参数
     * @return 执行结果
     */
    Wrapper<ComplexTaskCompleteVO> completeTask(TaskExecuteVO executeVO);

    /**
     * 连续执行流程步骤
     * @param executeVO 接口参数
     * @return 执行结果
     */
    Wrapper<ComplexTaskCompleteVO> completeSerialTasks(SerialTaskExecuteVO executeVO);

    /**
     * 启动单一的外部流程或内部流程
     * @param startVO 接口参数
     * @return 启动结果
     */
    Wrapper<SimpleTaskCompleteVO> startSimpleProcess(TaskStartVO startVO);


    /**
     * 启动单一的外部流程或内部流程，并执行第一个步骤
     * @param startVO 接口参数
     * @return 执行结果
     */
    Wrapper<SimpleTaskCompleteVO> startSimpleProcessThenCompleteFirstTask(TaskStartVO startVO);

    /**
     * 执行单一的外部流程、或内部流程
     * @param executeVO 接口参数
     * @return 执行结果
     */
    Wrapper<SimpleTaskCompleteVO> completeSimpleTask(TaskExecuteVO executeVO);

    /**
     * 查询流程参数(dataId)
     * @param queryVO 接口参数
     * @return 参数列表
     */
    Wrapper<List<Long>> findProcessDataIds(ProcessDataQueryVO queryVO);

    /**
     * 根据任务Id，（异步）删除流程实例
     * @param taskIdVO 接口参数
     */
    void deleteProcessInstance(TaskIdVO taskIdVO);
}
